﻿:-op(200, fy, 'not').

/*************
 * F A C T S *
 *************/

fact(X; Y, CF):-
	!, fact(X, CF1), fact(Y, CF2), max(CF1, CF2, CF).
fact(X, CF):-
	X, CF is 1;
	\+X, X \= av(_, _), CF is -1.
	
/*****************
 * A S K A B L E *
 *****************/

askable(name, 'Tên bạn là gì?').
askable(birthYear, 'Bạn sinh năm nào?').
askable(gender, 'Giới tính của bạn?').
askable(weight, 'Bạn bao nhiêu cân?').
askable(height, 'Bạn cao bao nhiêu centimet?').

askable(like_taste(sour), 'Bạn thích ăn chua không?').
askable(like_taste(hot), 'Bạn thích ăn cay không?').
askable(like_taste(salty), 'Bạn thích ăn mặn không?').
askable(like_taste(sweet), 'Bạn thích ăn ngọt không?').

askable(isNormalMeal, 'Bạn muốn một bữa ăn thông thường?').
askable(mealTime, 'Bạn muốn chọn món ăn cho buổi nào?').

askable(like_ingredient(thit_bo), 'Bạn thích các món làm từ thịt bò không?').
askable(like_ingredient(thit_heo), 'Bạn thích các món làm từ thịt lợn không?').
askable(like_ingredient(thit_ga), 'Bạn thích các món làm từ thịt gà không?').


askable(hate, 'Ban co ghet mon gi khong?').
askable(work_hard, 'Ban co phai lao dong vat va khong?').
askable(stomachache, 'Ban co bi dau da day khong?').
askable(like, 'Ban co dac biet thich an mon gi hom nay khong?').

/* JOB ASKABLE */
askable(job,'Bạn làm nghề gì?').


/* DISEASE ASKABLE */
askable(got_st_disease(ill), 'Bạn có bị ốm không?').
askable(still_st_disease(ill), 'Bạn có còn bị ốm không?').

askable(got_st_disease(flu), 'Bạn có bị cảm không?').
askable(still_st_disease(flu), 'Bạn có còn bị cảm không?').

askable(got_st_disease(toothache), 'Bạn có bị đau răng không?').
askable(still_st_disease(toothache), 'Bạn có còn bị đau răng không?').

askable(got_st_disease(acne), 'Bạn có bị mụn không').
askable(still_st_disease(acne), 'Bạn có còn bị mụn không?').

askable(got_disease(stomachache), 'Bạn có bị đau dạ dày không').
askable(got_disease(diabetes), 'Bạn có bị tiểu đường không?').
askable(got_disease(gout), 'Bạn có bị thống phong (gout) không?').
askable(got_disease(osteoporosis),'Bạn có bị loãng xương không?').
askable(got_disease(heart_disease),'Bạn có bị bệnh tim mạch không?').
askable(got_disease(high_cholesteron),'Bạn có bị máu nhiễm mỡ').

%askable(disease, 'Bạn đang bị những bệnh gì?').

askable(allergy, 'Bạn có dị ứng với những thức ăn gì?').

/* SPECIAL CASE ASKABLE */
askable(pregnant, 'Bạn có thai không?').
askable(has_baby, 'Bạn có phải cho con bú không?').

askable(play_sport, 'Bạn có tập thể thao cường độ cao không?').


default(av(birthYear, Y), 0.1) :- date(Y-14, _, _, _, _, _, _, _, _). 
default(av(gender, male), 0.501).
default(av(weight, 50), 0.2).
default(av(height, 150), 0.2).

default(av(like_taste(sour), yes), 0.1).
default(av(like_taste(hot), yes), -0.2).
default(av(like_taste(salty), yes), 0.1).
default(av(like_taste(sweet), yes), 0.2).

default(av(isNormalMeal, yes), 0.1).

default(av(like_ingredient(thit_bo), yes), 0.5).
default(av(like_ingredient(thit_heo), yes), 0.2).
default(av(like_ingredient(thit_ga), yes), 0.6).

/*************
 * R U L E S *
 *************/

/* AGE RULES */

rule(
	'P1',
	lhs([av(birthYear, X), get_time(T), stamp_date_time(T, date(Y, _, _, _, _, _, _, _, _), 'UTC'), Age is Y - X]),
	rhs(av(age, Age), 1)
).
rule(
	'P2',
	lhs([av(age, X), X >= 0, X =< 3]),
	rhs(av(ageCategorize, baby), 0.85)
).
rule(
	'P3',
	lhs([av(age, X), X >= 4, X =< 10]),
	rhs(av(ageCategorize, kid), 0.85)
).
rule(
	'P4',
	lhs([av(age, X), X >= 10, X =< 14]),
	rhs(av(ageCategorize, child), 0.85)
).
rule(
	'P5',
	lhs([av(age, X), X >= 15, X =< 24]),
	rhs(av(ageCategorize, youth), 0.85)
).
rule(
	'P6',
	lhs([av(age, X), X >= 25, X =< 64]),
	rhs(av(ageCategorize, adult), 0.85)
).
rule(
	'P7',
	lhs([av(age, X), X >= 65]),
	rhs(av(ageCategorize, senior), 0.85)
).

rule(
	'P8',
	lhs([av(ageCategorize, senior), av(hardness(X), hard)]),
	rhs(av(like_recipe(X), yes),-0.6)
).

rule(
	'P9',
	lhs([av(ageCategorize, baby), av(hardness(X), hard)]),
	rhs(av(like_recipe(X), yes),-0.9)
).
/* LIKES RULES */

/* HEALTH RULES */

/*** BMI: Chỉ số cơ thể*/

rule(
	'HEALTHR01',
	lhs([av(height,H),av(weight,W), BMI is W*10000/(H*H)]),
	rhs(av(bmi,BMI),1)
).

rule(
	'HEALTHR02',
	lhs([av(bmi,BMI), av(gender,male), BMI < 20]),
	rhs(av(fitness,thin),1)
).
rule(
	'HEALTHR03',
	lhs([av(bmi,BMI), av(gender,male), BMI >= 20, BMI < 25]),
	rhs(av(fitness,normal),1)
).
rule(
	'HEALTHR04',
	lhs([av(bmi,BMI), av(gender,male), BMI >= 25, BMI < 30]),
	rhs(av(fitness,fat),1)
).
rule(
	'HEALTHR05',
	lhs([av(bmi,BMI), av(gender,male), BMI > 30]),
	rhs(av(fitness,over_weighted),1)
).

rule(
	'HEALTHR06',
	lhs([av(bmi,BMI), av(gender,female), BMI < 18]),
	rhs(av(fitness,thin),1)
).
rule(
	'HEALTHR07',
	lhs([av(bmi,BMI), av(gender,female), BMI >= 18, BMI < 23]),
	rhs(av(fitness,normal),1)
).
rule(
	'HEALTHR08',
	lhs([av(bmi,BMI), av(gender,female), BMI >= 23, BMI < 30]),
	rhs(av(fitness,fat),1)
).
rule(
	'HEALTHR09',
	lhs([av(bmi,BMI), av(gender,female), BMI > 30]),
	rhs(av(fitness,over_weighted),1)
).

/*** dị ứng*/

rule(
	'ALLERGY01',
	lhs([av(allergy,L), ingredient(Y), member(Y,L)]),
	rhs(av(like_ingredient(Y), yes),-1)
).

/*** bệnh ngắn hạn*/

/*** bệnh mãn tính*/



/*rule(
	'DISEASE01',
	lhs([av(disease,L),member(X,L)]),
	rhs(av(oh_shit_got_disease(X), yes),1)
).%is this need??*/


rule(
	'DISEASE02',
	lhs([av(got_disease(stomachache),yes),av(taste(X),sour)]),
	rhs(av(like_recipe(X), yes),-0.6)
).

rule(
	'DISEASE02',
	lhs([av(got_disease(stomachache),yes),av(taste(X),hot)]),
	rhs(av(like_recipe(X), yes),-0.6)
).

rule(
	'DISEASE02',
	lhs([av(got_disease(diabetes),yes),av(taste(X),sweet)]),
	rhs(av(like_recipe(X), yes),-0.8)
).

rule(
	'DISEASE02',
	lhs([av(got_disease(gout),yes),av(taste(X),hot)]),
	rhs(av(like_recipe(X), yes),-0.8)
).

rule(
	'DISEASE02',
	lhs([av(got_disease(gout),yes),av(calorie(X),high)]),
	rhs(av(like_recipe(X), yes),-0.8)
).

rule(
	'DISEASE02',
	lhs([av(got_disease(heart_disease),yes),av(calorie(X),high)]),
	rhs(av(like_recipe(X), yes),-0.9)
).

rule(
	'DISEASE02',
	lhs([av(got_disease(high_cholesteron),yes),av(calorie(X),high)]),
	rhs(av(like_recipe(X), yes),-0.9)
).

/* SEX RULES */

/* JOB RULES */

rule(
	'JOBR01',
	lhs([av(job,Y), av(nature_job(Y), intellectual), av(calorie(X),normal)]),
	rhs(av(like_recipe(X), true), 1)
).
rule(
	'JOBR02',
	lhs([av(job,Y), av(nature_job(Y), intellectual), av(calorie(X),high)]),
	rhs(av(like_recipe(X), true), 0.5)
).

rule(
	'JOBR03',
	lhs([av(job,Y), av(nature_job(Y), manual), av(calorie(X),normal)]),
	rhs(av(like_recipe(X), true), 0.5)
).
rule(
	'JOBR04',
	lhs([av(job,Y), av(nature_job(Y), manual), av(calorie(X),high)]),
	rhs(av(like_recipe(X), true), 1)
).

/*** JOB FACTS */
fact(av(nature_job(teacher), intellectual), 1).
fact(av(nature_job(engineer), intellectual), 1).
fact(av(nature_job(student), intellectual), 1).
fact(av(nature_job(architect), intellectual), 1).

fact(av(nature_job(build), manual), 1).
fact(av(nature_job(porter), manual), 1).
fact(av(nature_job(guard), manual), 1).

/* SPORT RULES */

/* PREVIOUS SESSON RULES */

/* SPECIAL RULES */

%fact(av(good_for_pregnant(???),yes),1).
/*
	súp lơ xanh (bông cải xanh), 
	bột ngũ cốc, 
	hạt đậu, đậu lăng
	sữa không béo
	chuối
	thịt nạc
	pho mát
	trứng
	bột yến mạch
	rau xanh
	bánh mì
	cam
	đậu tương

rule(
	'PREGNANT01',
	lhs([av(gendle,female),av(pregnant,yes), av(good_for_pregnant(X),yes)]),
	rhs(av(like_ingredient(X),yes),0.9).
).
*/

%fact(av(good_for_has_baby(???),yes),1).
/*
	Thì là (Saunf)
	Cỏ cà ri (Methi)
	Hạt mè (Til)
	Mơ (Khubani)
	Cà rốt, củ cải (Shakharkand)
	Rau xanh
	Mùi tây (Ajmooda)
	Tỏi
	Gừng
	Đu đủ xanh
	Ngũ cốc và đậu
	Chất béo và dầu
	Yến mạch (Jaee hoặc Avena sativa)
	Tảo spirulina

rule(
	'PREGNANT01',
	lhs([av(gendle,female),av(has_baby,yes), av(good_for_has_baby(X),yes)]),
	rhs(av(like_ingredient(X),yes),0.9).
).
*/
%fact(av(bad_for_has_baby(???),yes),1).
/*
	Đồ ăn kích thích
	Quả bơ
	nhiều mỡ
	hành tỏi

rule(
	'PREGNANT01',
	lhs([av(gendle,female),av(has_baby,yes), av(bad_for_has_baby(X),yes)]),
	rhs(av(like_ingredient(X),yes),-0.9).
).

*/

rule(
	'SPORTR01',
	lhs([av(play_sport,yes), av(calorie(X),high)]),
	rhs(av(like_recipe(X), true), 0.9)
).

/* DATE-TIME RULES */

/* WEATHER RULES */

temperature(0,0,30).

rule(
	'WEATHERR01',
	lhs([av(temper(Day,Time),X), X >= 40]),
	rhs(av(temp_categorize(Day,Time),very_hot),0.9)
).

rule(
	'WEATHERR02',
	lhs([av(temper(Day,Time),X), X < 40, X >= 30 ]),
	rhs(av(temp_categorize(Day,Time),hot),0.9)
).

rule(
	'WEATHERR03',
	lhs([av(temper(Day,Time),X), X < 30, X >= 20 ]),
	rhs(av(temp_categorize(Day,Time),comfortable),0.9)
).

rule(
	'WEATHERR04',
	lhs([av(temper(Day,Time),X), X < 20, X >= 10 ]),
	rhs(av(temp_categorize(Day,Time),cold),0.9)
).

rule(
	'WEATHERR05',
	lhs([av(temper(Day,Time),X), X < 10, X >= 0 ]),
	rhs(av(temp_categorize(Day,Time),very_cold),0.9)
).

rule(
	'WEATHERR06',
	lhs([av(temper(Day,Time),X), X < 0 ]),
	rhs(av(temp_categorize(Day,Time),frozen),0.9)
).

rule(
	'WEATHERR07',
	lhs([temperature(Day,Min,Max), X is (Min*3+Max)/4]),
	rhs(av(temper(Day,dinner),X),0.9)
).

rule(
	'WEATHERR08',
	lhs([temperature(Day,Min,Max), X is (Min+Max)/2]),
	rhs(av(temper(Day,breakfast),X),0.9)
).

rule(
	'WEATHERR09',
	lhs([temperature(Day,Min,Max), X is (Min+Max*3)/4]),
	rhs(av(temper(Day,lunch),X),0.9)
).
/* TOP LAYER RULES */

rule(
	'T1',
	lhs([av(mealTime, T), av(mealTime(X), L), member(T, L)]),
	rhs(av(like_meal(X), true), 0.95)
).
rule(
	'T2',
	lhs([av(mealTime, T), av(mealTime(X), L), \+member(T, L)]),
	rhs(av(like_meal(X), true), -0.3)
).

rule(
	'L1',
	lhs([ingredient(Y), av(like_ingredient(Y), yes), av(ingredients(X), L), member(Y, L)]),
	rhs(av(like_recipe(X), true), 0.7)
).

like((X, CF)):-
	recipe(X), findgoal(av(like_recipe(X), true), CF).
like((X, CF), G):-
	recipe(X), findgoal(av(group(X), G), 1), findgoal(av(like_meal(X), true), CF).

meals(Meal, CF):-
	findall((M, CFM), like((M, CFM), rice), L_Rice), mergesort(L_Rice, SL_Rice),
	findall((M, CFM), like((M, CFM), meat), L_Meat), mergesort(L_Meat, SL_Meat),
	findall((M, CFM), like((M, CFM), special), L_Special), mergesort(L_Special, SL_Special),
	%log(L),
	meals2(Meal, CF, SL_Rice, SL_Meat, SL_Special).

meals2(Meal, CF, L_Rice, L_Meat, L_Special):-
	L_Rice = [(X, CFX)|TX],
	L_Meat = [(Y, CFY)|TY],
	L_Special = [(Z, CFZ)|TZ],
	CFN is CFX * CFY,
	(
		CFN > CFZ -> Meal = [X, Y], CF is CFN;
		Meal = [Z], CF is CFZ
	).
meals2(Meal, CF, L_Rice, L_Meat, L_Special):-
	L_Rice = [(X, CFX)|TX],
	L_Meat = [(Y, CFY)|TY],
	L_Special = [(Z, CFZ)|TZ],
	CFN is CFX * CFY,
	(
		CFN > CFZ ->
			(
				TX = [] -> findall((M, CFM), like((M, CFM), rice), NewL_Rice), mergesort(NewL_Rice, SL_Rice), meals2(Meal, CF, SL_Rice, TY, L_Special);
				meals2(Meal, CF, TX, TY, L_Special)
			);
		meals2(Meal, CF, L_Rice, L_Meat, TZ)
	).
